/**
 * Clase PantallaRegistro: define la pantalla que vera el usuario, la primera vez que arranque la
 * aplicacion, para que pueda almacenar sus parametros identificativos, y de esta manera evitar
 * el tedioso proceso de login en un dispostivo movil (mejoras de USABILIDAD)
 */
package infbmobile.pantallas;

// Importaciones externas
import com.sun.lwuit.*;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.events.ActionListener;

// Importaciones internas
import com.sun.lwuit.layouts.BoxLayout;
import com.sun.lwuit.plaf.Style;
import infbmobile.main.*;
import infbmobile.comunicaciones.*;
import infbmobile.util.UIHerramientas;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import javax.microedition.media.Manager;
import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.control.RecordControl;
import javax.microedition.media.control.VideoControl;

public class PantallaGrabadora extends Form implements ActionListener {
    // Referencia al midlet principal

   private InfBMobileMedico midlet;

    // Atributos de clase

    private TextField nombre;
    private Command enviar,  Camara;
    private Command comandoSalir;
    private Player player;
    private Command comandograbar,comandoParar,comandoReproducir;
    private MediaComponent cam;
    private RecordControl recordControl; 
    private Player capturePlayer ;

   private Player playbackPlayer = null;
   private ByteArrayOutputStream bos = new ByteArrayOutputStream();

   private ByteArrayInputStream bis = null;
    private boolean PararGrabacion=false,PararReproduccion=false;

    public static String[] opciones=new String[]{"Parar","Reproducir","Enviar Grabacion"};
    // Hash de asociacion de botones a pantallas
    private Hashtable hashBotonesOpciones;
    private int numFilas;
    private int numColumnas;
    private String dni;
   

    /*
     * Constructor principal de la clase
     */
    public PantallaGrabadora(InfBMobileMedico midlet,String dni) {
        super("Grabadora");
        this.midlet = midlet;
        this.dni=dni;
        
        // Definimos el layout del formulario
         setLayout(new BoxLayout(BoxLayout.Y_AXIS));
       // Definimos el layout del formulario

        
         hashBotonesOpciones=new Hashtable();
        int anchoMaxBoton=0;
        int anchoPantalla=Display.getInstance().getDisplayWidth();

        Image[] iconosIn=new Image[opciones.length];
        Image[] iconosOut=new Image[opciones.length];
        // Cargamos los iconos
        for(int i=0;i<opciones.length;i++){
            // Obtenemos las imagenes de los iconos
            try{
                iconosIn[i]=Image.createImage("/res/iconos/"+opciones[i]+"_IN.png");
                iconosOut[i]=Image.createImage("/res/iconos/"+opciones[i]+"_OUT.png");
            }catch(IOException ioe){
                ioe.printStackTrace();
            }
            // Creamos el boton con el icono
            Button boton=new Button(opciones[i],iconosOut[i]);
            // Modificamos la aparencia del boton
            Style estiloBoton=boton.getStyle();
            estiloBoton.setBorder(null);
            estiloBoton.setBgTransparency(0);
            // Centramos el texto del boton y lo posicionamos debajo de la imagen
            boton.setAlignment(Label.CENTER);
            boton.setTextPosition(Label.BOTTOM);
            // Establecemos la imagen a mostrar cuando el icono sea seleccionado
            boton.setRolloverIcon(iconosIn[i]);
            boton.addActionListener(this);
            // Creamos la asociacion del boton a la pantalla
            hashBotonesOpciones.put(boton,opciones[i]);
            // Agregamos el boton al formulario
            addComponent(boton);
            // De todos los botones procesados, nos quedamos con aquel de anchura maxima
            // pues el sera el que determinara cuantas "columnas" dispondra la pantalla
            // (puesto que el numero de columnas va en funcion de la maxima anchura de
            // un elemento mostrado por pantalla)
            anchoMaxBoton=Math.max(boton.getPreferredW(),anchoMaxBoton);

        }// Configuramos los comandos
        comandoSalir=new Command("Salir");
        addCommand(comandoSalir);
        comandograbar=new Command("Grabar");
        addCommand(comandograbar);

        setCommandListener(this);
        

    }

    public void actionPerformed(ActionEvent evento) {
        Object fuente = evento.getSource();

        // Recogemos de donde vino el evento
        if (fuente == comandograbar) {
               MostrarGrabadora();
             
        } else if (fuente == comandoSalir) {
             System.gc();
             midlet.mostrarPantallaBusquedaMisPacientes();
             //finally {
            try {
                if (bos != null) {
                    bos.close();
                }
                if (bis != null) {
                    bis.close();
                }
            } catch (Exception ex) {
                //error(ex);
            //}
        }
            

        } else if (fuente == Camara) {
           // MostrarGrabadora();
        } else if (fuente == enviar) {


        }
        else{
            // Detectamos el icono pulsado
            String opcion=(String)hashBotonesOpciones.get(fuente);
            cargarOpcion(opcion);

        }

    }
     
  /**
     Procedimiento Para mostrar la grabadora
   */
    public void MostrarGrabadora() {

        try {
      capturePlayer = Manager.createPlayer("capture://audio");
      if (capturePlayer != null) {

        capturePlayer.realize();
        recordControl = (RecordControl) capturePlayer.getControl("javax.microedition.media.control.RecordControl");
       
        if (recordControl == null)
          throw new Exception("No RecordControl available");
        bos = new ByteArrayOutputStream(1024);
        recordControl.setRecordStream(bos);
        Grabacion();
      
      } else {
        throw new Exception("Capture Audio Player is not available");
      }
    } catch (Exception e) {
     // error(e);
    }
    }
private void cargarOpcion(String pantalla) {
        if(pantalla.equalsIgnoreCase("Parar")){
           //Paramos la grabacion
            PararGrabacion();
        }
        else if(pantalla.equalsIgnoreCase("Reproducir")){
           //Reproducir la grabacion
            ReproducirGrabacion();
        }
        else if(pantalla.equalsIgnoreCase("Enviar Grabacion")){
           //Enviar la grabacion
            EnviarGrabacion();
        }
        // Asi con todas las pantallas que vayamos creando
    }
 private void Grabacion() {
     
     try {
         
         capturePlayer.start();
         recordControl.startRecord();
         PararGrabacion=true;
      
      }catch (Exception ex) {
        //error(ex);
      }
    }

    private void PararGrabacion() {
        try {
            
            if(PararGrabacion==true){
                recordControl.stopRecord();
                recordControl.commit();
                capturePlayer.stop();
                bos.flush();
                bis = new ByteArrayInputStream(bos.toByteArray());
                PararGrabacion=false;

               
            }
            else if(PararReproduccion==true){
             playbackPlayer.stop();
             PararReproduccion=false;
            }
            


        } catch (Exception e) {
            //error(e);
        } 
    }
  private void   ReproducirGrabacion(){
      try {
                 playbackPlayer = Manager.createPlayer(bis, recordControl.getContentType());
                 playbackPlayer.start();
                 PararReproduccion=true;
      }
      catch (Exception e) {
            //error(e);
        }
  }

   private void EnviarGrabacion()
   {            GrabadoraMovil con = new GrabadoraMovil(bos.toByteArray(), dni);
                Thread t = new Thread(con);
                t.start();

   }
}

